#include <controller/FriendController.h>
#include <entity/FriendInfoEntity.h>
#include <cppwinks/utility/json/Json.h>
#include <dao/FriendDao.h>
#include <cppwinks/mysql/exception/SQLException.h>
#include <iostream>
#include <vector>
#include <string>

using namespace std;
using namespace json;
using namespace network;

HttpReply FriendController::getFriendList(const network::HttpRequest &req)
{
    try
    {
        // 获取URI
        unordered_map<std::string, std::string> repuest_parameter_map = req.getUrlParameter();
        // 拿到ID
        std::string value = repuest_parameter_map.at("id");
        int num = std::stoi(value);
        // 创建容器收纳FriendInfoEntity
        std::vector<FriendInfoEntity> tmp;
        // 拿到好友ID列表
        std::vector<int> fried_id_arry = friend_dao->getFriendIds(num);
        // 通过循环遍历ID，拿到FriendInfoEntity，并放入tmp中
        for (int id : fried_id_arry)
        {
            FriendInfoEntity user_informatio = friend_dao->getFriendInfoByid(id);
            tmp.push_back(user_informatio);
        }
        // 给前端返回的JSON
        Json ret;
        // 存放每次得到的FriendInfoEntity
        Json jsondata;
        // 通过循环收纳到jsondata
        for (FriendInfoEntity data : tmp)
        {
            // a是用于存储FriendInfoEntity数据
            Json a;
            a["id"] = data.getId();
            a["name"] = data.getUsername();
            a["avatar_url"] = data.getAvatarUrl();
            jsondata.append(a);
        }
        // 打包发送
        ret["code"] = 1;
        ret["msg"] = "请求成功";
        ret["data"] = jsondata;
        HttpReply rep("200");
        rep.setBody(ret.toString());
        return rep;
    }
    catch (const std::invalid_argument &e)
    {
        Json ret;
        // 处理无效参数异常
        ret["code"] = 0;
        ret["msg"] = "参数无效";
        HttpReply rep("400");
        Json errorJson;
        errorJson["error"] = "“id” 参数无效。它应该是一个有效的整数。";
        cout << e.what() << endl;
        rep.setBody(errorJson.toString());
        return rep;
    }
    catch (const std::out_of_range &e)
    {
        Json ret;
        ret["code"] = 0;
        ret["msg"] = "参数超出范围";
        // 处理超出范围异常
        HttpReply rep("400");
        Json errorJson;
        errorJson["error"] = "“id” 参数超出范围。";
        rep.setBody(errorJson.toString());
        cout << e.what() << endl;
        return rep;
    }
    catch (const std::exception &e)
    {
        // 处理其他异常
        Json ret;
        ret["code"] = 0;
        ret["msg"] = "内部服务器错误";
        HttpReply rep("500");
        Json errorJson;
        errorJson["error"] = "内部服务器错误： " + std::string(e.what());
        rep.setBody(errorJson.toString());
        cout << e.what() << endl;
        return rep;
    }
}
